package main

import "fmt"

func main() {

	//遍历方式一:使用常规的for循环遍历切片
	var arr [5]int = [...]int{10, 20, 30, 40, 50}
	//slice := arr[1:4] //20,30,40
	slice := arr[1:4]

	for i := 0; i < len(slice); i++ {
		fmt.Printf("slice[%v]=%v \n", i, slice[i])
	}

	fmt.Println()

	//遍历方式二:使用for-range方式遍历
	for i, v := range slice {
		fmt.Printf("i=%v v=%v \n", i, v)
	}

	//fmt.Println(slice[3])	//越界!

	slice2 := slice[1:2] // slice[20,30,40] 	[30,40]
	slice2[0] = 100      //因为arr,slice 和 slice2 指向的数据空间是同一个,因此slice2[0]=100,其他的都变化

	fmt.Println("slice2=", slice2)
	fmt.Println("slice=", slice)
	fmt.Println("arr=", arr)

	fmt.Println()

	for i, v := range slice {
		fmt.Printf(i, v)
	}

	//用append内置函数,可以对切片进行动态追加
	var slice3 []int = []int{100, 200, 300}
	//通过append直接给slice3追加具体的元素,注意:类型需要保持一致
	//并且append后,需要使用自己进行接收,因为append是新创建了一个切片,重新赋值给slice3
	slice3 = append(slice3, 400, 500, 600)
	fmt.Println("slice3", slice3) //{100,200,300,400,500,600}

	//通过append将切片slice3追加给slice3  ...是追加切片时的固定写法
	//并且【切片】只能append【切片】 不能是数组
	slice3 = append(slice3, slice3...) //100,200,300,400,500,600 100,200,300,400,500,600
	fmt.Println("slice3", slice3)

	//切片的拷贝操作
	//切片使用copy内置函数完成拷贝，举例说明
	var slice4 []int = []int{1, 2, 3, 4, 5}
	var slice5 = make([]int, 10)

	//copy内置函数，参数只能是切片
	copy(slice5, slice4)
	fmt.Println("slice4=", slice4) //1,2,3,4,5
	fmt.Println("slice5=", slice5) //1,2,3,4,5,0,0,0,0,0
}
